2023/12/232122字符
变量声明
var 存在的问题
- 变量可被重新赋值;
- 变量提升;
- 作用域:for 循环输出
i
=i + 1
, 需通过闭包解决; - 挂载到 window 上,污染全局变量。
if (Math.random() > .5) {
var a = 111;
}
console.log(a); // 进入判断:111,否则:undefined
function test () {
var arr = [];
for (var i = 0; i < 10; i ++) {
arr[i] = () => console.log(i);
}
return arr;
}
var myArr = test();
for(var j = 0; j < 10; j ++){
myArr[j](); //--> 10 * 10 函数执行
}
let
块级作用域 {} 加强
if (true) {
let num = 123;
}
console.log(num); //--> 报错 无法访问到 num
let 没有预解析,不存在变量提升,必须先定义,再使用
let num = 234;
function fn () {
console.log(num2); // TDZ 暂时性死区
let num = 345;
}
fn(); //--> num is not defined
不可重复定义变量
let num3 = 123;
let num3 = 234; //--> 'num3' has already been declared
块级作用域影响
for(let i = 0; i < 3; i ++){
console.log(i); //--> 0 1 2
}
console.log(i); //--> 'i' has already been declared
let arr = [];
for(let i = 0; i < 10; i ++){
arr[i] = function(){
console.log(i);
}
}
arr[2](); //--> 2
const
常量不得随意更改
const num;
num = 234; //--> 报错
const arr = [1, 2, 3, 4, 5];
arr = []; //--> 报错 对象或数组数不能进行直接更改
const arr1 = ['apple', 'banana'];
arr1.push('orange');
console.log(arr1); //--> ["apple", "banana", "orange"] 对象本身是可以修改的
const arr2 = Object.freeze(['apple', 'banana']); // 冻结对象
arr2.push('orange');
console.log(arr2); //--> object is not extensible
// 特殊的常量量命名方式:全部大写 const PI = 3.1415926;
for (const prop in arr1) {
console.log(prop)
}